package com.itheima.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.domain.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    @Autowired
    RedisTemplate redisTemplate;

    /**
     * 查询所有
     * @return
     */
    @RequestMapping("/findAll")
    public String findAll() throws JsonProcessingException {
        String userAllCache = (String) redisTemplate.boundValueOps("user.findAll").get();
        //第一次查询，去缓存中取数据
        if(StringUtils.isEmpty(userAllCache)){
            //如果没有
            //从数据库取
            List<User> allUser = userService.findAll();
            //把用户集合数据转换为json字符串
            ObjectMapper jsonFormat = new ObjectMapper();
            userAllCache = jsonFormat.writeValueAsString(allUser);
            //缓存redis
            redisTemplate.boundValueOps("user.findAll").set(userAllCache);
            System.out.println("-------------从数据库获取数据-------------");
            //返回用户数据
            return userAllCache;
        }else {
            //如果有，直接返回用户数据
            System.out.println("-------------从Redis缓存获取数据-------------");
            return userAllCache;
        }
    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @RequestMapping("/findById")
    public User findById(Integer id) {
        return userService.findById(id);
    }

    /**
     * 新增
     * @param user
     */
    @RequestMapping("/save")
    public void save(User user) {
        userService.save(user);
    }

    /**
     * 修改
     * @param user
     */
    @RequestMapping("/update")
    public void update(User user) {
        userService.update(user);
    }

    /**
     * 删除
     * @param id
     */
    @RequestMapping("/delete")
    public void delete(Integer id) {
        userService.delete(id);
    }
}
